package com.segi.view.refresh;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

import com.segi.view.recyclerview.CustomRecyclerView;

/**
 * Author: chen
 * Date: [2018/3/22]
 */

public class PullToRefreshRecyclerView extends PullToRefreshBase<CustomRecyclerView> {

    /**滚动的监听器*/
    private RecyclerView.OnScrollListener mScrollListener;

    public PullToRefreshRecyclerView(Context context) {
        super(context);
        setPullLoadEnabled(false);
    }

    public PullToRefreshRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setPullLoadEnabled(false);
    }

    public PullToRefreshRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setPullLoadEnabled(false);
    }

    @Override
    protected CustomRecyclerView createRefreshableView(Context context, AttributeSet attrs) {
        CustomRecyclerView recyclerView = new CustomRecyclerView(context);
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int scrollState) {
                super.onScrollStateChanged(recyclerView, scrollState);
                if (isScrollLoadEnabled()) {
                    if (scrollState == RecyclerView.SCROLL_STATE_IDLE) {
                        if (isReadyForPullUp()) {
                            startLoading();
                        }
                    }
                }

                if (null != mScrollListener) {
                    mScrollListener.onScrollStateChanged(recyclerView, scrollState);
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (null != mScrollListener) {
                    mScrollListener.onScrolled(recyclerView, dx, dy);
                }
            }
        });
        return recyclerView;
    }

    /**
     * 设置滑动的监听器
     *
     * @param l 监听器
     */
    public void setOnScrollListener(RecyclerView.OnScrollListener l) {
        mScrollListener = l;
    }

    @Override
    protected boolean isReadyForPullUp() {
        return isLastItemVisible();
    }

    @Override
    protected boolean isReadyForPullDown() {
        return isFirstItemVisible();
    }

    /**
     * 判断第一个child是否完全显示出来
     *
     * @return true完全显示出来，否则false
     */
    private boolean isFirstItemVisible() {
        final CustomRecyclerView.Adapter<?> adapter = getRefreshableView().getAdapter();

        // 如果未设置Adapter或者Adapter没有数据可以下拉刷新
        if (null == adapter || adapter.getItemCount() == 0) {
            return true;

        } else {
            // 第一个条目完全展示,可以刷新
            if (getFirstVisiblePosition() == 0) {
                return mRefreshableView.getChildAt(0).getTop() >= mRefreshableView
                        .getTop();
            }
        }

        return false;
    }

    /**
     * 获取第一个可见子View的位置下标
     */
    private int getFirstVisiblePosition() {
        View firstVisibleChild = mRefreshableView.getChildAt(0);
        return null != firstVisibleChild ? mRefreshableView
                .getChildAdapterPosition(firstVisibleChild) : -1;
    }

    /**
     * 判断最后一个child是否完全显示出来
     *
     * @return true完全显示出来，否则false
     */
    private boolean isLastItemVisible() {
        final CustomRecyclerView.Adapter<?> adapter = getRefreshableView().getAdapter();

        // 如果未设置Adapter或者Adapter没有数据可以上拉刷新
        if (null == adapter || adapter.getItemCount() == 0) {
            return true;

        } else {
            // 最后一个条目View完全展示,可以刷新
            int lastVisiblePosition = getLastVisiblePosition();
            if(lastVisiblePosition >= mRefreshableView.getAdapter().getItemCount()-1) {
                return mRefreshableView.getChildAt( mRefreshableView.getChildCount() - 1).getBottom()
                        <= mRefreshableView.getBottom();
            }
        }

        return false;
    }

    /**
     * 获取最后一个可见子View的位置下标
     */
    private int getLastVisiblePosition() {
        View lastVisibleChild = mRefreshableView.getChildAt(mRefreshableView
                .getChildCount() - 1);
        return null != lastVisibleChild ? mRefreshableView
                .getChildAdapterPosition(lastVisibleChild) : -1;
    }
}
